package cn.felord.rediscache;

import cn.felord.rediscache.config.StringPool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@CacheConfig(cacheNames = StringPool.smsCode)
public class CaptchaCache {

    /**
     * @CacheEvict主要针对方法配置，能够根据一定的条件对特定的缓存进行清空,该注解有两个特别的属性： allEntries 是否清空所有缓存内容，缺省为 false，如果指定为 true，则方法调用后将立即清空所有缓存。注意不能跟key参数同时使用。
     * beforeInvocation 是否在方法执行前就清空，缺省为 false，如果指定为 true，则在方法还没有执行的时候就清空缓存，缺省情况下，如果方法执行抛出异常，则不会清空缓存。
     */
    @CachePut(key = "#key")
    public String put(String key, String code) {
        log.info("执行 cachePut");
        return code;
    }

    @CacheEvict(key = "#key")
    public void expire(String key) {
        System.out.println("expire");
    }

    @Cacheable(key = "#key")
    public String get(String key) {
        return "abc";
    }

    /**
     * 每次都会存入缓存
     */
    @CachePut(cacheNames = StringPool.smsCode)
    public String put2(String key) {
        return "abc";
    }
}
